/**
 * 资源压缩脚本
 *
 * 该脚本用于在构建过程中对项目资源进行压缩处理，以减小资源体积，提高加载性能。
 *
 * 主要功能包括：
 * 1. JavaScript文件压缩：
 *    - 根据配置识别需要压缩的JS文件
 *    - 使用第三方工具进行JS代码压缩
 *    - 自动将压缩后的文件重命名为.min.js格式
 *    - 删除原始未压缩文件
 *
 * 2. PNG图片压缩：
 *    - 识别项目中的PNG图片文件
 *    - 支持配置忽略特定图片的压缩
 *    - 调用外部压缩工具进行图片质量压缩
 *    - 生成压缩任务文件并执行压缩命令
 *
 * 3. XML文件格式化压缩：
 *    - 对XML文件进行格式化处理
 *    - 移除多余空白字符以减小文件体积
 *
 * 4. 文件名处理：
 *    - 在上传前自动重命名压缩文件
 *    - 确保压缩文件使用标准的.min后缀命名
 *
 * 工作流程：
 * - 在构建流程中自动执行压缩任务
 * - 检查配置确定需要压缩的资源类型
 * - 遍历新增和更新的文件列表
 * - 对匹配的文件执行相应压缩操作
 * - 在上传前处理文件名，确保使用压缩版本
 *
 * 支持的配置选项：
 * - JS压缩开关和文件匹配规则
 * - PNG图片压缩质量设置
 * - 图片压缩忽略列表
 * - 文件路径匹配模式（glob模式）
 *
 * 适用场景：
 * - Web项目资源优化
 * - 减少网络传输数据量
 * - 提高页面加载速度
 * - 降低服务器带宽消耗
 */
package com.script

import com.entity.PackPath
import com.utils.ScriptUtils.appConfig
import com.utils.ScriptUtils.contrastFile
import com.utils.ScriptUtils.rootPath
import com.utils.ScriptUtils.script
import org.apache.logging.log4j.kotlin.logger
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

script.onCompress = ::compress
script.subpackageStart = ::subpackageStart

private fun compress() {
    logger.info("进入压缩资源流程")

    val addFile = contrastFile.addFileList
    val updateFile = contrastFile.updateFileList

    val fileList = addFile + updateFile
    // 检查是否有需要压缩
    if (appConfig.runEnvironment().compreeJs) {
        val compressConfig = appConfig.compress.js.config
        if (compressConfig.isNotEmpty()) {
            logger.info("已经开启JS压缩")
            val tempCompressFile = mutableListOf<PackPath>()
            // 需要压缩的文件
            for (compressFile in compressConfig) {
                // 获取目录下所有的文件
                for (oldFile in fileList) {
                    // 存在需要压缩的js文件
                    if (contrastFile.validatePath(oldFile, compressFile, ".min.js")) {
                        println("$oldFile $compressFile")
                        if (oldFile.exists()) { // 新添加判断文件是否存在
                            logger.info("发现需要压缩JS文件: $oldFile")
                            tempCompressFile.add(oldFile)
                        } else {
                            logger.info("压缩JS文件不存在: $oldFile")
                        }
                    }
                }
            }
            logger.info("总共需要压缩的文件数: ${tempCompressFile.size}")
            contrastFile.compressJS(tempCompressFile)
            logger.info("压缩JS文件完成")
            tempCompressFile.forEach { it.deleteRecursively() }
        } else
            logger.info("没有开启JS压缩")
    }


    // 如果设置了 压缩值   就要执行压缩图片
    if (appConfig.compress.image.quality != null) {
        val compressPathList = mutableListOf<String>()
        for (file in fileList) {
            if (file.extension.equals("png", true)) {
                // 查看是否有忽略压缩的文件

                if (appConfig.compress.image.ignoreFile.any { contrastFile.validatePath(file, it) }) {
                    logger.info("不压缩图片: $file")
                } else {
                    compressPathList.add(file.absolutePathString)
                }
            }
        }

        if (compressPathList.isNotEmpty()) {
            val uploadFile = PackPath(
                "${rootPath}/uploadConfig/compressImg_${
                    LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss"))
                }.txt"
            )
            uploadFile.writeText(compressPathList.joinToString(","))

            val script =
                "java -jar ${rootPath}/data/CompressPic.jar ${appConfig.compress.image.quality} ${uploadFile.pathString}"
            logger.info("压缩图片: $script")

            contrastFile.exec(
                "java",
                "-jar",
                "${rootPath}/data/CompressPic.jar",
                appConfig.compress.image.quality!!.toString(),
                uploadFile.pathString
            )
        } else {
            logger.info("本次没有需要压缩的图片!")
        }
    }


    // 压缩xml文件
    // 获取目录下所有的文件
    for (oldFile in fileList) {
        // 存在需要压缩的xml文件
        if (oldFile.extension.equals("xml", true)) {
            logger.info("压缩XML文件: $oldFile")
            if (oldFile.exists()) { // 新添加判断文件是否存在
                contrastFile.formatXml(oldFile, oldFile)
                logger.info("压缩XML文件完成: $oldFile")
            } else {
                logger.info("压缩XML文件不存在: $oldFile")
            }
        }
    }

    //    if (packConfig.compressXml != null) {
    //    }

}

// 打包更新上传前
private fun subpackageStart() {
//    logger.info("上传前执行压缩文件更名")
//    val addOss = contrastFile.addOssPush
//    logger.info("上传前执行压缩文件更名结束")
}